CloudFront KeyValueStoreがリリース。CloudFront Functionsからキーバリューストアを利用可能に!
AWS向けのCDNサービスCloudFrontがCDNエッジ向けのグローバルかつ低遅延なキーバリューストアAmazon CloudFront KeyValueStoreをリリースしました。 CloudFront向けエッジ・コンピューティングサービスのCloudFront Functions(CF2)から利用出来ます。
CF2はLambda@Edge(L@E)に比べて速くて安いといったメリットもありましたが、CloudFront Functions関数内に閉じた簡易的な文字列操作しか出来ませんでした。 そのため、豊富なライブラリのインストール、さらには、インターネットアクセス(DB接続)も可能なL@Eに比べて、処理内容が限定的でした。
今回のアップデートにより、CloudFront FunctionsはデータストアKeyValueStoreと連携し、設定を元に処理を変えたり、小規模なアプリをエッジだけで動作させたり、CF2のコードに持たせていた設定をKVSに外だししたりと活用の幅が大いに広がるでしょう。
CloudflareのWorkers KVやFastlyのKV Store相当の機能です。
Amazon CloudFront KeyValueStoreについて
Amazon CloudFront KeyValueStoreは名前の通りCDN CloudFront向けの安全・グローバル・低遅延なキーバリューストアです。
CloudFront Functions向けのデータストアであり、Lambda@Edgeからはアクセス出来ません。
ユースケースとしては、KeyValueStoreのデータを元に、以下のような処理を行えます。
- URLのリダイレクト・書き換え
- A/Bテストフラグ
- 認可ロジック
データストアには最大5MBのデータを保存でき、キーの最大サイズは512バイト、値の最大サイズは1KBです。
利用費は100万回の読み取りあたり $0.03 です。最大5MBのデータストア費用は発生しません。
KVSのバリュー(値)には、以下のタイプが指定できます。
- 文字列
- エンコード文字列
- JSON
データストアにS3から指定のフォーマットでデータをインポートすることもできます。
{ "data":[ { "key":"key1", "value":"value" }, { "key":"key2", "value":"value" } ] }
操作の流れ
KeyValueStoreを作成し、CloudFront Functionsと紐づけるだけで準備完了です。
CloudFront Functionsのランタイム 2.0 にはヘルパーメソッドが用意されており、以下の様にして簡単に KeyValueStore を操作できます。
import cf from 'cloudfront'; const kvsId = 'XXX'; const kvsHandle = cf.kvs(kvsId); value = await kvsHandle.get(key);
やってみた
実際にコンソールから操作してみます。
1. CloudFront KeyValueStore の作成
コンソールでは、CloudFrontのFunctions配下に、CloudFront Functionsと並列にKeyValueStoreのメニューが追加されています。
「Create KeyValueStore」からKeyValueStoreを作成します。
S3経由でデータをロードすることもできます。
初期データとして、food:udon
の1レコードを追加します。
2. CloudFront Function の作成と KeyValueStorとの紐づけ
CloudFront Functionの編集画面で「Associated KeyValueStore」から手順1で作成した KeyValueStore と紐づけます。
紐付けると、このKVSを利用するサンプルコードも提供されるので、そのまま利用しましょう。
URIのパスを /
で区切って先頭のパス部をキーにして KeyValueStore から値を取得し、レスポンスに利用するという、シンプルなコードです。
kvsId
の値は実際の環境に合わせて調整してください。
import cf from 'cloudfront'; const kvsId = 'XXX'; // This fails if the key value store is not associated with the function const kvsHandle = cf.kvs(kvsId); async function handler(event) { // Use the first part of the pathname as key, for example http(s)://domain/<key>/something/else const key = event.request.uri.split('/')[1] let value = "Not found" // Default value try { value = await kvsHandle.get(key); } catch (err) { console.log(`Kvs key lookup failed for ${key}: ${err}`); } var response = { statusCode: 200, statusDescription: 'OK', headers: { 'x-added-by-cf': { "value": value } }, body: { encoding: 'text', data: `Key: ${key} Value: ${value}` } }; return response; }
3. CloudFront Function を公開
作成した CloudFront Functionを公開し、ディストリビューションの Viewer Request に紐づます。
4. CloudFront から動作確認
ディストリビューションに GET
メソッドでアクセスして動作確認します。
設定直後はデプロイが完了していないため、KVSにアクセスしても、値が見つかりません。
$ curl https://XXX.cloudfront.net/food Key: food Value: Not found
暫く経つと、値が見つかりました。
$ curl -D - https://XXX.cloudfront.net/food HTTP/2 200 server: CloudFront date: Tue, 21 Nov 2023 22:29:26 GMT content-length: 21 x-added-by-cf: udon x-cache: FunctionGeneratedResponse from cloudfront via: 1.1 XXX.cloudfront.net (CloudFront) x-amz-cf-pop: NRT12-C3 alt-svc: h3=":443"; ma=86400 x-amz-cf-id: dS8NIRsrhdwcb-1BW_uaIwLHFamqziWQ_oDSyM5aL262t9H3yjN4qw== Key: food Value: udon
ヘルパーメソッド
提供されているヘルパーメソッドは以下の3つです。(参考)
get
: キーからバリューを取得exists
: キーが存在するかチェックmeta
: KVSのレコード数、作成・最終更新日時を取得
更新系メソッドは存在しません。
また、データアクセスのインターフェースはSQLではなくKey/Valueです。
KeyValueStoreのデータ更新はエッジではなくAWSリージョン側でのみ行なえ、エッジに結果整合性的に展開されると考えられます。
このときにポイントとなるのは meta
メソッドの返す「最終更新日時(lastUpdatedDateTime
)」です
データはCloudFront Functions起動時にメモリ上に展開されます。
デプロイ時の注意
CloudFront Functionはパブリッシュして初めてコードがデプロイされます。
関数に紐づく KeyValueStore 情報も、デプロイして初めて反映されます。
そのため、KeyValueStore の付け替えを行うと、公開が完了するまでは
- Development KeyValueStore(デプロイされるKVS)
- Live KeyValueStore(デプロイ済みのKVS)
が異なります。
最後に
エッジコンピューティングのCloudFront Functionから利用できるエッジ向けのキーバリューストア KeyValueStore がリリースされました。
従来のCloudFront Functionは外部との連携ができませんでしたが、今回のアップデートにより、KVSの設定によって動きを変えたり、CloudFront Functionsのコード内に持たせていた設定情報をKVSに外だししてコードと設定を独立させたり、小規模なアプリケーションをエッジだけで動作させたりと、活用の幅が大きく広がります。
5MBのリードオンリーなデータストアで何ができるか想像力を働かせ、CloudFront Functionsをガンガン使い倒しましょう。
それでは。